package com.swak.define;

import com.swak.annotation.Column;
import com.swak.annotation.Pk;
import com.swak.asm.FieldCache.FieldMeta;

import lombok.Getter;
import lombok.Setter;
import lombok.experimental.Accessors;

/**
 * 列定义
 * 
 * @author lifeng
 * @date 2020年10月8日 上午12:12:32
 */
@Getter
@Setter
@Accessors(chain = true)
public class ColumnDefine {

	/**
	 * 列名称
	 */
	public String name;

	/**
	 * java 属性
	 */
	public String javaProperty;

	/**
	 * java 属性 类型
	 */
	public Class<?> javaPropertyType;

	/**
	 * Java 类型
	 */
	public FieldMeta javaField;

	/**
	 * 列定义
	 */
	public Column define;

	/**
	 * 是否是主键列
	 * 
	 * @return
	 */
	public boolean isPk() {
		return javaField.getAnnotation(Pk.class) != null || "id".equals(javaProperty);
	}

	/**
	 * 是否是版本字段
	 * 
	 * @return
	 */
	public boolean isVersion() {
		return "version".equals(javaProperty);
	}

	/**
	 * 是否是创建时间
	 * 
	 * @return
	 */
	public boolean isCreateDate() {
		return "createDate".equals(javaProperty);
	}

	/**
	 * 是否是修改时间
	 * 
	 * @return
	 */
	public boolean isUpdateDate() {
		return "updateDate".equals(javaProperty);
	}

	/**
	 * 是否统计列
	 * 
	 * @return
	 */
	public boolean isStat() {
		Column column = javaField.getAnnotation(Column.class);
		return column != null && column.stat() && Number.class.isAssignableFrom(javaPropertyType);
	}

	/**
	 * 是否统计列开关列： 0, 1
	 * 
	 * @return
	 */
	public boolean isToggle() {
		Column column = javaField.getAnnotation(Column.class);
		return column != null && column.toggle() && Number.class.isAssignableFrom(javaPropertyType);
	}

	/**
	 * 是否统计列： Max 统计
	 * 
	 * @return
	 */
	public boolean isMax() {
		Column column = javaField.getAnnotation(Column.class);
		return column != null && column.max() && Number.class.isAssignableFrom(javaPropertyType);
	}

	/**
	 * 是否统计列： Min 最小统计
	 * 
	 * @return
	 */
	public boolean isMin() {
		Column column = javaField.getAnnotation(Column.class);
		return column != null && column.min() && Number.class.isAssignableFrom(javaPropertyType);
	}

	/**
	 * 定义列
	 * 
	 * @return
	 */
	public static ColumnDefine of(String name, String javaProperty, FieldMeta field) {
		ColumnDefine column = new ColumnDefine();
		column.name = name;
		column.javaProperty = javaProperty;
		column.javaField = field;
		column.javaPropertyType = field.getFieldClass();
		column.define = field.getAnnotation(Column.class);
		return column;
	}
}